/**
 * 该文件中主要完成对 axios 的二次封装
 */
import axios from 'axios'

//引入 vant 的轻提示组件以备用
import { showLoadingToast, closeToast } from 'vant';

import store from '../store'

// 创建一个 axios 实例
const service = axios.create({
    baseURL: 'http://162.14.108.31:3000',   //基准URL路径 
    timeout: 10000, //超时时间
})

//请求拦截
service.interceptors.request.use( (config)=>{
    //提示数据加载中
    showLoadingToast({
        message: '数据加载中...',
        forbidClick: true,
        loadingType: 'spinner',
        duration: 0,
    })

    //TODO: 统一在请求头中添加 token 认证字段的传递
    // 如果 token 是保存在 store 中,则从 store 中获取 token 数据

    const token = store.getters['user/token']
    if(token){
        //将 token 添加到请求头中
        config.headers.Authorization = `Bearer ${token}`
    }

    //需要return配置对象config才能继续发起网络请求
    return config
} , (error)=>{
    console.error('请求拦截失败',error)
    //关闭轻提示效果
    closeToast(true)
} )

//响应拦截
service.interceptors.response.use(response => {
    //响应返回,则关闭轻提示效果
    closeToast(true)

    //根据响应对象中的 HTTP 状态码进行判断
    if(response.status >= 200 && response.status <300){
        //请求成功,获取后端响应返回的数据
        const responseData = response.data
        //对响应的数据统一进行规范格式处理
        //后端统一返回数据的格式规范为:{ code,message,data }
        //code 为200时表示成功,则从 data 中获取数据
        const { code,message,data } = responseData
        if(code === 200){
            return data
        }
        //当返回的 code 不为 200 时,返回一个 rejected 状态的 promise 对象
        return Promise.reject(new Error(message))
    }
},error =>{
    console.error('响应拦截失败',error)
    //关闭轻提示效果
    closeToast(true)
})

//导出
export default service